const express = require('express');
const app = express();
const joi = require('joi');

// 导入并配置 cors 中间件
const cors = require('cors');
app.use(cors())

// 配置解析表单数据的中间件，注意：这个中间件，只能解析 application/x-www-form-urlencoded 格式的表单数据
app.use(express.json())
app.use(express.urlencoded({ extended: false }))

// 上传图片访问
app.use('/uploads',express.static('./uploads'))

// 一定要在路由之前，封装 res.sendJson 函数
const {analyzeToken, sendJson} = require('./middleware');
app.use(analyzeToken, sendJson)

// 一定要在路由之前配置解析 Token 的中间件
const {expressjwt:expressjwt} = require('express-jwt')
const {jwt:jwtConf} = require('./config')
app.use(expressjwt({secret:jwtConf.jwtSecretKey,algorithms: ["HS256"]}).unless({path:[/^\/api\//]}))

// 导入并使用用户路由模块
const userRouter = require('./router/user');
app.use('/api', userRouter)
// 导入并使用用户信息的路由模块
const userinfoRouter = require('./router/userinfo');
app.use('/my', userinfoRouter)
// 导入并使用文章分类的路由模块
const artCateRouter = require('./router/artcate');
app.use('/my/article', artCateRouter)
// 导入并使用文章的路由模块
const articleRouter = require('./router/article');
app.use('/my/article', articleRouter)
// 导入并使用新闻的路由模块 演示mongoose
const newsRouter = require('./router/news');
app.use('/home/news', newsRouter)
// 导入并使用公共的路由模块 演示mongoose
const commonRouter = require('./router/common');
app.use('/home/common', commonRouter)

// 定义错误级别的中间件
app.use((err,req,res,next) => {
    // 验证失败导致的错误
    if (err.name === 'UnauthorizedError') {
        return res.sendJson('无效的token！', 401)
    }else if(err instanceof joi.ValidationError) {
        return res.sendJson(err)
    }
    return res.send({
        status: 500,
        message: err.message || '未知的错误',
    })
})

// 启动服务器
app.listen(8898, ()=>console.log('listening on http://localhost:8898'))
